package controllers;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import models.Group;
import models.Model;
import models.Student;
import views.MainFrame;
import views.StudentView;
import views.GroupView;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;


/**
 * Created with IntelliJ IDEA.
 * User: Артемка
 * Date: 12.12.13
 * Time: 8:39
 * To change this template use File | Settings | File Templates.
 */
public class GeneralController {


    private final MainFrame mainFrame;
    private StudentView studentView;
    private GroupView groupView;
    
    private final Model model;

    //конструктор контроллера
    public GeneralController(MainFrame mainFrame, Model model) {
        this.mainFrame = mainFrame;
        this.model = model;
        //action binding
        mainFrame.addListenerForRemoveStudent(new RemoveStudentAction());
        mainFrame.addListenerForAddStudent(new ShowStudentView());
        mainFrame.addListenerForEditStudent(new EditStudentAction());
        mainFrame.addListenerForRemoveGroup(new RemoveGroupAction());
        mainFrame.addListenerForAddGroup(new ShowGroupView());
        mainFrame.addListenerForEditGroup(new EditGroupAction());
        
        //TODO выгрузка данных о студентах в коллекцию, затем из коллекции в MainFrame
                
        //
        
    }




    private class AddStudentAction implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {


            //следующий код
           if (addStudent()) {
                studentView.addMessage("Студент успешно добавлен!");
                studentView.setVisible(false);
                //вывод в List главной формы обновленный список студентов
                mainFrame.renewStudentList(model.getStudentList());
            } else
                studentView.errorMessage("Студент с такими параметрами уже существует!");
        }
    }

    private class AddGroupAction implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {

            if (addGroup()) {
                groupView.addMessage("Группа успешно добавлена!");
                groupView.setVisible(false);
                //вывод в List главной формы обновленный список групп
                mainFrame.renewGroupList(model.getGroupList());
            } else
                groupView.errorMessage("Группа с такими параметрами уже существует");
        }
    }

    private class EditStudentAction implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            
            if (editStudent()) {
                studentView.addMessage("Студент успешно изменен!");
                studentView.setVisible(false);
                //вывод в List главной формы обновленный список студентов
                mainFrame.renewStudentList(model.getStudentList());
            } else
                studentView.errorMessage("Студент с такими параметрами уже существует!");
        }
    }

    private class EditGroupAction implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {

            if (editGroup()) {

                groupView.addMessage("Группа успешно изменена!");
                groupView.setVisible(false);
                //вывод в List главной формы обновленный список групп
                mainFrame.renewGroupList(model.getGroupList());
            } else
                groupView.errorMessage("Группа с такими параметрами уже существует");
        }
    }
    
    private class RemoveStudentAction implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
        
        }
    }
    
    private class RemoveGroupAction implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
        
        }
    }


    private class ShowStudentView implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            studentView = new StudentView();
            studentView.setVisible(true);
            studentView.setSize(600, 400);
            studentView.addListenerForAdd(new AddStudentAction());
        }
    }


    private class ShowGroupView implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            groupView = new GroupView();
            groupView.setVisible(true);
            groupView.setSize(600, 400);
            groupView.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            groupView.addListenerForAdd(new AddGroupAction());
        }
    }




//    public GeneralController(MainFrame mainFrame, Model model) {
//        this.mainFrame = mainFrame;
//        this.model = model;
//        //action binding
//        mainFrame.addListenerForRemoveStudent(new RemoveAction());
//        mainFrame.addListenerForAddStudent(new AddAction());
//        mainFrame.addListenerForEditStudent(new EditAction());
//        // выгрузка данных о студентах в коллекцию, затем из коллекции в MainFrame
//
//
//        //
//    }

    private boolean addStudent() {

        Student student = new Student();
        if (student!=null)
            student.setName(studentView.getName());
        student.setSurname(studentView.getSurname());
        student.setPatronymic(studentView.getPatronymic());
        student.setGroup(model.getGroupList().get(studentView.getGroup())); //выбранная пользователем группа
        SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");
        try {
            student.setDate(df.parse(studentView.getDate()));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        student.setId(student.hashCode());

        if(model.getStudentList().contains(student))
               if( !studentView.errorMessage("Студент с такими параметрами уже существует! продолжить добавление?"))
               // такой студент уже есть уже есть. Предупреждаем об этом пользователя
                   return false;// пользователь не дал согласие на добавление
                          // если дал, то продолжаем метод

        model.getStudentList().add(student);    // добавляем нового студента в коллекцию
        studentView.addMessage("Студент успешно добавлен!");
        return true;
    }

    private boolean addGroup() {

        Group group = new Group();
        group.setGroupName(groupView.getNameGroup());
        group.setFaculty(groupView.getFaculty());
        group.setId(group.hashCode());

        if(model.getGroupList().contains(group))
                if(!groupView.errorMessage("Группа с такими параметрами уже существует! Продолжить добавление?"))

                return false;    // пользователь не дал согласие. Прекращаем выполнение метода
                            // иначе продолжаем выполнять метод
        

        model.getGroupList().add(group);   // группы нет и мы её добавляем
        groupView.addMessage("Группа успешно добавлена!");
        return true;
    }

    public boolean editStudent() {
        // в этом методе мы сперва создаем с измененными пользователем параметрами
        // если в коллекции нет объекта с такими же параметрами, производим изменение полей
        // изменяемого объекта
        Student student = new Student();
        student.setName(studentView.getName());
        student.setSurname(studentView.getSurname());
        student.setPatronymic(studentView.getPatronymic());
        student.setGroup(model.getGroupList().get(studentView.getGroup())); //выбранная пользователем группа
        SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");

        try {
            student.setDate(df.parse(studentView.getDate()));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        student.setId(student.hashCode());

       
        if(model.getStudentList().contains(student))
        {
            if( studentView.errorMessage("Студент с такими параметрами уже существует! продолжить изменение?"))
            // такой студент уже есть уже есть. Предупреждаем об этом пользователя
                return false;// пользователь не дал согласие на добавление
                // если дал, то продолжаем метод
        }
            
        try {
            student.setDate(df.parse(studentView.getDate()));
        } catch (ParseException e) {
            //TODO handle me
            e.printStackTrace();
        }

        student.setId(student.hashCode());
        groupView.addMessage("Студент успешно изменен!");
        return true;
    }

    public boolean editGroup() {
        // принцип работы аналогичен editStudent
        Group group = new Group();

        group.setGroupName(groupView.getNameGroup());
        group.setFaculty(groupView.getFaculty());
        group.setId(group.hashCode());

        if(model.getGroupList().contains(group))

                if(!groupView.errorMessage("Группа с такими параметрами уже существует! Продолжить зменение?"))

                    return false;    // пользователь не дал согласие. Прекращаем выполнение метода
                // иначе продолжаем выполнять метод
            
        
        groupView.addMessage("Группа успешно изменена!");
        return true;

    }


    public void showMainView() {
        mainFrame.setVisible(true);
        mainFrame.setSize(600, 400);
        mainFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }



}

